集成学习按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,另一类是个体学习器之间不存在强依赖关系。前者的代表算法就是是boosting系列算法。在boosting系列算法中, Adaboost是最著名的算法之一。Adaboost既可以用作分类,也可以用作回归。本文就对Adaboost算法做一个总结。
在集成学习原理中,我们已经讲到了boosting算法系列的基本思想,如下图: 从图中可以看出,Boosting算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重, 使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练 弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。 不过有几个具体的问题Boosting算法没有详细说明。
我们这里讲解Adaboost是如何解决上一节这4个问题的。 假设我们的训练集样本是 $$ T=\left\{\left(x, y_1\right),\left(x_2, y_2\right), \ldots\left(x_m, y_m\right)\right\} $$ 训练集的在第 $\mathrm{k}$ 个弱学习器的输出权重为 $$ D(k)=\left(w_{k 1}, w_{k 2}, \ldots w_{k m}\right) ; \quad w_{1 i}=\frac{1}{m} ; \quad i=1,2 \ldots m $$ 首先我们看看Adaboost的分类问题。 分类问题的误差率很好理解和计算。由于多元分类是二元分类的推广,这里假设我们是二元分类问题,输出为 $\{-1$ , 1$\}$ ,则第 $\mathrm{k}$ 个弱分类器 $G_k(x)$ 在训 练集上的加权误差率为 $$ e_k=P\left(G_k\left(x_i\right) \neq y_i\right)=\sum_{i=1}^m w_{k i} I\left(G_k\left(x_i\right) \neq y_i\right) $$ 接着我们看弱学习器权重系数,对于二元分类问题,第 $\mathrm{k}$ 个弱分类器 $G_k(x)$ 的权重系数为 $$ \alpha_k=\frac{1}{2} \log \frac{1-e_k}{e_k} $$ 为什么这样计算弱学习器权重系数? 从上式可以看出,如果分类误差率 $e$ 越大,则对应的弱分类器权重系数 $\alpha_k$ 越小。也就是说,误差率小的弱分类器权 重系数越大。具体为什么采用这个权重系数公式,我们在讲Adaboost的损失函数优化时再讲。
第三个问题,更新更新样本权重 $\mathrm{D}$ 。假设第 $\mathrm{k}$ 个弱分类器的样本集权重系数为 $D(k)=\left(w_{k 1}, w_{k 2}, \ldots w_{k m}\right)$ ,则对应的第 $\mathrm{k}+1$ 个弱分类器的样本集权 重系数为 $$ w_{k+1, i}=\frac{w_{k i}}{Z_K} \exp \left(-\alpha_k y_i G_k\left(x_i\right)\right) $$ 这里 $Z_k$ 是规范化因子 $$ Z_k=\sum_{i=1}^m w_{k i} \exp \left(-\alpha_k y_i G_k\left(x_i\right)\right) $$ $\mathrm{k}+1$ 个弱分类器中减少,具体为什么采用样本权重更新公式,我们在讲Adaboost的损失函数优化时再讲。 最后一个问题是集合策略。Adaboost分类采用的是加权表决法,最终的强分类器为 $$ f(x)=\operatorname{sign}\left(\sum_{k=1}^K \alpha_k G_k(x)\right) $$ 接着我们看看Adaboost的回归问题。由于Adaboost的回归问题有很多变种,这里我们以Adaboost R2算法为准。 我们先看看回归问题的误差率的问题,对于第k个弱学习器,计算他在训练集上的最大误差 $$ E_k=\max \left|y_i-G_k\left(x_i\right)\right| i=1,2 \ldots m $$ 然后计算每个样本的相对误差 $$ e_{k i}=\frac{\left|y_i-G_k\left(x_i\right)\right|}{E_k} $$
这里是误差损失为线性时的情况,如果我们用平方误差,则 $e_{k i}=\frac{\left(y_i-G_k\left(x_i\right)\right)^2}{E_k^2}$, 如果我们用的是指数误差,则 $e_{k i}=1-\exp \left(\frac{-\left|y_i-G_k\left(x_i\right)\right|}{E_k}\right.$ ) 最终得到第k个弱学习器的 误差率 $$ e_k=\sum_{i=1}^m w_{k i} e_{k i} $$ 我们再来看看如何得到弱学习器权重系数 $\alpha$ 。这里有: $$ \alpha_k=\frac{e_k}{1-e_k} $$ 对于更新更新样本权重 $D$ ,第 $k+1$ 个弱学习器的样本集权重系数为 $$ w_{k+1, i}=\frac{w_{k i}}{Z_k} \alpha_k^{1-e k i} $$ 这里 $Z_k$ 是规范化因子 $$ Z_k=\sum_{i=1}^m w_{k i} \alpha_k^{1-e k i} $$ 最后是结合策略,和分类问题稍有不同,采用的是对加权的弱学习器取权重中位数对应的弱学习器作为强学习器的方法,最终的强回归器为 $$ f(x)=G_{k^*}(x) $$ 其中, $G_k(x)$ 是所有 $\ln \frac{1}{\alpha_k}, k=1,2, \ldots K$ 的中位数值对应序号 $k^*$ 对应的弱学习器。
刚才上一节我们讲到了分类Adaboost的弱学习器权重系数公式和样本权重更新公式。但是没有解释选择这个公式的原因,让人觉得是魔法公式一样。其 实它可以从Adaboost的损失函数推导出来。 从另一个角度讲, Adaboost是模型为加法模型,学习算法为前向分步学习算法,损失函数为指数函数的分类问题。 模型为加法模型好理解,我们的最终的强分类器是若干个弱分类器加权平均而得到的。 前向分步学习算法也好理解,我们的算法是通过一轮轮的弱学习器学习,利用前一个强学习器的结果和当前弱学习器来更新当前的强学习器的模型。也 就是说,第 $\mathrm{k}-1$ 轮的强学习器为 $$ f_{k-1}(x)=\sum_{i=1}^{k-1} \alpha_i G_i(x) $$ 而第 $\mathrm{k}$ 轮的强学习器为 $$ f_k(x)=\sum_{i=1}^k \alpha_i G_i(x) $$ 上两式一比较可以得到 $$ f_k(x)=f_{k-1}(x)+\alpha_k G_k(x) $$ 可见强学习器的确是通过前向分步学习算法一步步而得到的。 Adaboost损失函数为指数函数,即定义损失函数为 $$ \underbrace{\arg \min }_{\alpha, G} \sum_{i=1}^m \exp \left(-y_i f_k(x)\right) $$ 利用前向分步学习算法的关系可以得到损失函数为
$$ \left(\alpha_k, G_k(x)\right)=\underbrace{\arg \min }_{\alpha, G} \sum_{i=1}^m \exp \left[\left(-y_i\right)\left(f_{k-1}(x)+\alpha G(x)\right)\right] $$令 $w_{k i}^{\prime}=\exp \left(-y_i f_{k-1}(x)\right)$ ,它的值不依赖于 $\alpha, G$ ,因此与最小化无关,仅仅依赖于 $f_{k-1}(x)$,随着每一轮迭代而改变。 将这个式子带入损失函数, 损失函数转化为 $$ \left(\alpha_k, G_k(x)\right)=\underbrace{\arg \min }_{\alpha, G} \sum_{i=1}^m w_{k i}^{\prime} \exp \left[-y_i \alpha G(x)\right] $$ 首先,我们求 $G_k(x)$ , $$ \begin{aligned} \sum_{i=1}^m w_{k i}^{\prime} e x p\left(-y_i \alpha G\left(x_i\right)\right) &=\sum_{y_i=G_k\left(x_i\right)} w_{k i}^{\prime} e^{-\alpha}+\sum_{y_i \neq G_k\left(x_i\right)} w_{k i}^{\prime} e^\alpha \\ &=\left(e^\alpha-e^{-\alpha}\right) \sum_{i=1}^m w_{k i}^{\prime} I\left(y_i \neq G_k\left(x_i\right)\right)+e^{-\alpha} \sum_{i=1}^m w_{k i}^{\prime} \end{aligned} $$ 基于上式,可以得到 $$ G_k(x)=\underbrace{\arg \min }_G \sum_{i=1}^m w_{k i}^{\prime} I\left(y_i \neq G\left(x_i\right)\right) $$ 将 $G_k(x)$ 带入损失函数,并对 $\alpha$ 求导,使其等于 0 ,则就得到了 $$ \alpha_k=\frac{1}{2} \log \frac{1-e_k}{e_k} $$
其中, $e_k$ 即为我们前面的分类误差率。 $$ e_k=\frac{\sum_{i=1}^m w_{k i}^{\prime} I\left(y_i \neq G\left(x_i\right)\right)}{\sum_{i=1}^m w_{k i}^{\prime}}=\sum_{i=1}^m w_{k i} I\left(y_i \neq G\left(x_i\right)\right) $$ 最后看样本权重的更新。利用 $f_k(x)=f_{k-1}(x)+\alpha_k G_k(x)$ 和 $w_{k i}^{\prime}=\exp \left(-y_i f_{k-1}(x)\right)$ ,即可得: $$ w_{k+1, i}^{\prime}=w_{k i}^{\prime} \exp \left[-y_i \alpha_k G_k(x)\right] $$ 这样就得到了我们第二节的样本权重更新公式。
这里我们对AdaBoost二元分类问题算法流程做一个总结。 输入为样本集 $T=\left\{\left(x, y_1\right),\left(x_2, y_2\right), \ldots\left(x_m, y_m\right)\right\}$ ,输出为 $\{-1 ,+1\}$ ,弱分类器算法, 弱分类器迭代次数 $\mathrm{K}$ 。 输出为最终的强分类器 $f(x)$
其中 $R$ 为类别数。从上式可以看出,如果是二元分类, $R=2$ ,则上式和我们的二元分类算法中的弱分类器的系数一致。
这里我们对AdaBoost回归问题算法流程做一个总结。AdaBoost回归算法变种很多,下面的算法为Adaboost R2回归算法过程。 输入为样本集 $T=\left\{\left(x, y_1\right),\left(x_2, y_2\right), \ldots\left(x_m, y_m\right)\right\}$ ,,弱学习器算法,弱学习器迭代次数 $\mathrm{K}$ 。 输出为最终的强学习器 $f(x)$
b) 计算训练集上的最大误差 $$ E_k=\max \left|y_i-G_k\left(x_i\right)\right| i=1,2 \ldots m $$
c) 计算每个样本的相对误差: 如果是线性误差,则 $e_{k i}=\frac{\left|y_i-G_k\left(x_i\right)\right|}{E_k}$; 如果是平方误差,则 $e_{k i}=\frac{\left(y_i-G_k\left(x_i\right)\right)^2}{E_k^2}$ 如果是指数误差,则 $e_{k i}=1-\exp \left(\frac{-\left|y_i-G_k\left(x_i\right)\right|}{E_k}\right)$
d) 计算回归误差率 $$ e_k=\sum_{i=1}^m w_{k i} e_{k i} $$ c) 计算弱学习器的系数 $$ \alpha_k=\frac{e_k}{1-e_k} $$ d) 更新样本集的权重分布为 $$ w_{k+1, i}=\frac{w_{k i}}{Z_k} \alpha_k^{1-e_{k i}} $$ 这里 $Z_k$ 是规范化因子 $$ Z_k=\sum_{i=1}^m w_{k i} \alpha_k^{1-e k i} $$
为了防止Adaboost过拟合,我们通常也会加入正则化项,这个正则化项我们通常称为步长(learning rate)。定义为 $\nu$,对于前面的弱学习器的迭代 $$ f_k(x)=f_{k-1}(x)+\alpha_k G_k(x) $$ 如果我们加上了正则化项,则有 $$ f_k(x)=f_{k-1}(x)+\nu \alpha_k G_k(x) $$ $\nu$ 的取值范围为 $0<\nu \leq 1$ 。对于同样的训练集学习效果,较小的 $\nu$ 意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起 来决定算法的拟合效果。
到这里Adaboost就写完了,前面有一个没有提到,就是弱学习器的类型。理论上任何学习器都可以用于Adaboost.但一般来说,使用最广泛的 Adaboost弱学习器是决策树和神经网络。对于决策树,Adaboost分类用了CART分类树,而Adaboost回归用了CART回归树。 这里对Adaboost算法的优缺点做一个总结。 Adaboost的主要优点有:
转载自: